/**
 * 
 */
package org.yelongframework.model.generator.manager;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import org.yelongframework.commons.lang.ClassUtil;
import org.yelongframework.model.generator.manager.wrapper.GenFieldAndColumnWrapper;
import org.yelongframework.model.manager.AbstractModelAndTable;
import org.yelongframework.model.manager.FieldAndColumn;

/**
 * 默认的生成的模型和表
 * 
 * @since 1.0.0
 */
public class DefaultGenModelAndTable extends AbstractModelAndTable implements GenModelAndTable {

	/** 模型类名称 */
	private String modelClassName;

	/** 表名称 */
	private String tableName;

	/** 属性 */
	private GenModelAndTableProperties genModelAndTableProperties = new GenModelAndTableProperties();

	/** 字段列集合 */
	private List<GenFieldAndColumn> genFieldAndColumnList;

	// ==================================================构造器==================================================

	/**
	 * @param modelName       model 类全名称 如 org.yelong.core.model.Model
	 * @param tableName       表名称
	 * @param fieldAndColumns 字段列
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public DefaultGenModelAndTable(String modelClassName, String tableName,
			List<GenFieldAndColumn> genFieldAndColumnList) {
		this.modelClassName = Objects.requireNonNull(modelClassName);
		this.tableName = Objects.requireNonNull(tableName);
		initPossessFieldAndColumns((List) genFieldAndColumnList);
	}

	public DefaultGenModelAndTable(String modelClassName, String tableName) {
		this.modelClassName = Objects.requireNonNull(modelClassName);
		this.tableName = Objects.requireNonNull(tableName);
	}

	// ==================================================模型类==================================================

	@Override
	public String getModelClassName() {
		return this.modelClassName;
	}

	@Override
	public String getModelClassSimpleName() {
		return ClassUtil.getSimpleName(modelClassName);
	}

	@Override
	public String getModelClassPackageName() {
		return ClassUtil.getPackageName(modelClassName);
	}

	@Override
	public String getTableName() {
		return tableName;
	}

	// ==================================================字段列初始化==================================================

	@Override
	protected void setFieldAndColumns(List<FieldAndColumn> fieldAndColumns) {
		this.genFieldAndColumnList = fieldAndColumns.stream().map(x -> {
			if (x instanceof GenFieldAndColumn) {
				return (GenFieldAndColumn) x;
			}
			return new GenFieldAndColumnWrapper(x);
		}).collect(Collectors.toList());
	}

	@Override
	public List<FieldAndColumn> getFieldAndColumns() {
		return genFieldAndColumnList.stream().map(x -> (FieldAndColumn) x).collect(Collectors.toList());
	}

	@Override
	public List<GenFieldAndColumn> getGenFieldAndColumnAll() {
		return genFieldAndColumnList;
	}

	// ==================================================生成模型表属性==================================================

	@Override
	public GenModelAndTableProperties getProperties() {
		return genModelAndTableProperties;
	}
}
